//
//  TextView+Emoticon.swift
//  01.表情键盘
//
//  Created by Apple on 15/12/29.
//  Copyright © 2015年 Apple. All rights reserved.
//

import UIKit

extension UITextView {
    /// 获取textView中带表情图片的文本
    func emoticonText() -> String {
        // 拼接之后的文本内容
        var textM = ""

        // 表情图片会分段保存在textView.attributedText里面,需要分段获取,拼接起来
//        print("textView的文本:\(textView.attributedText)")
        // 遍历属性文本的每一段
        // attrName: 要遍历的String
        // inRange: 范围
        attributedText.enumerateAttributesInRange(NSRange(location: 0, length: attributedText.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (result, range, _) -> Void in
            // 如果result 字典里面包含 NSAttachment key就是一个图片,其他情况直接截取文本
//            print("result: \(result)")
//            print("range: \(range)")
//            print("--------")
            if let attachment = result["NSAttachment"] as? CZTextAttachment {
                // result 字典里面包含 NSAttachment key 就是一个图片,需要获取到附件图片的名称
                // 让附件里面带有图片的名称
                
                textM += attachment.chs!
            } else {
                // 文本,其他情况直接截取文本
                let text = (self.attributedText.string as NSString).substringWithRange(range)
                
                // 将截取的字符串拼接到textM后面
//                textM = textM + text
                textM += text
            }
        }
        
        // 返回拼接好的带表情名称的文本
        return textM
    }
    
    /**
     添加表情到textView里面
     
     - parameter emoticon: 要添加的表情模型
     */
    func insertEmoticon(emoticon: CZEmociton) {
        // 所有的表情被点击后,都会到这个方法里面来,所有在这里判断点击的是否是删除按钮
        if emoticon.removeEmoticon {
            // 删除textView中的内容(图片表情,emoji表情,普通文本)
            deleteBackward()
        }
        
        // 需要添加的表情有2种
        
        // 1.添加emoji表情
        if let emoji = emoticon.emoji {
            insertText(emoji)
            
            // 不需要在判断是图片表情
            return
        }
        
        // 2.添加图片表情
        if let pngPath = emoticon.pngPath {
            // 2.1创建附件
            let attachment = CZTextAttachment()
            
            // 2.2给附件添加图片
            attachment.image = UIImage(contentsOfFile: pngPath)
            
            // 2.2.1设置附件的图片名称
            attachment.chs = emoticon.chs
            
            // 2.2.2设置图片的bounds
            let w = font!.lineHeight
            attachment.bounds = CGRect(x: 0, y: -(w * 0.2), width: w, height: w)
            
            // 2.3将附件转成可变的属性文本
            let attrText = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
            
            // 2.3.2发现在图片后面连续添加图片,图片会变小.原因是附件缺少Font属性,给附件添加Font属性
            attrText.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
            
            // 2.4获取现有的属性文本,转成可变属性文本
            let currentAttrText = NSMutableAttributedString(attributedString: attributedText)
            
            // 2.5获取选中位置
            let sRange = selectedRange
            
            // 2.6将图片替换到现有文本选中的位置
            currentAttrText.replaceCharactersInRange(sRange, withAttributedString: attrText)
            
            // 2.7将替换好的属性文本赋值给textView
            attributedText = currentAttrText
            
            // 2.8设置光标位置
            selectedRange = NSRange(location: sRange.location + 1, length: 0)
            
            // 2.9当添加图片表情的时候不会触发textView的文本改变事件,不会发出通知,也不会调用代理
            // 2.9.1自己来发出通知
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
            // 2.9.2自己来调用代理
            delegate?.textViewDidChange?(self)
        }
    }
}
